/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package plan.mobile;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import mobile.Call;
import mobile.Message;
import mobile.MobileConsumption;
import plan.Plan;
import turnover.Consumption;

/**
 *
 * @author Ale
 */

/*
 Llamadas a fijos y a móviles de cualquier operador a cualquier hora todos los días 	17 cents. €/min.
llamadas a móviles Orange a cualquier hora todos los días 	0 cents. €/min. (*)


(*) Precio válido para la 2ª llamada y sucesivas, a cualquier destino Orange del día.
 La primera llamada a un destino Orange del día se tarificará a 17 cent €/min.

Consumo mínimo mensual: 12 €

Coste de establecimiento de llamada 15 cents €.
 */

public class Orange_Nuevo_Contrato_Unico extends Plan {

    private double startQuote =0d;
    private double minuteCost=0.17d;
    private double messageCost = 0.15d;

    /*El Contrato Decreciente es compatible con todas las promociones Orange y
    con  todos los módulos de ahorro, a excepción de  Mis 5 de Orange.*/
   
    public Orange_Nuevo_Contrato_Unico() {
        super.setName("Orange Nuevo Contrato Unico");
    }

    public double getStartQuote() {
        return startQuote;
    }

    @Override
    public double getCost(Consumption consumption) {

        double total = 0d;
        MobileConsumption mc = (MobileConsumption) consumption;
        Iterator it = mc.getCallList().listIterator();
        long duration = 0;
        List aux= new LinkedList();
        while (it.hasNext()) {
            Call c = (Call) it.next();

            if (c.isSpecial()) {
                total += c.getCost();
            }
            else if ( c.isMobile() || c.isFixedLineTelephone() && !this.IsOrangeCall(c)) {
                total += c.getDuration().changeSeconds() * this.minuteCost / 60;
                duration += c.getDuration().changeSeconds();
            }
            else if(c.isMobile() && this.IsOrangeCall(c) && !aux.contains(c)){
                total += c.getDuration().changeSeconds() * this.minuteCost / 60;
                aux.add(c);
            }
            else if(c.isMobile() && this.IsOrangeCall(c) && aux.contains(c)){
                duration += c.getDuration().changeSeconds();

            }
        }

        it = mc.getMessList().listIterator();
        while (it.hasNext()) {
            Message m = (Message) it.next();
            if (m.isSpecial()) {
                total += m.getCost();
            } else {
                total += this.messageCost;
            }
        }
        if (total<12d){
            total = 12d;
        }
        total += total * 0.16d;
        return total;
    }

    public double getMessageCost() {
        return messageCost;
    }

    private boolean IsOrangeCall(Call c){
        return c.getOperador().getName().equals("Orange");
    }

    public double getMinuteCost() {
        return minuteCost;
    }
}
